package org.stan.beanvalidator.factory;

import org.stan.beanvalidator.bean.PatternField;
import org.stan.beanvalidator.bean.ValidateResult;
import org.apache.commons.lang3.StringUtils;
import org.stan.beanvalidator.utils.ValidatorUtil;

import java.lang.reflect.Field;
import java.util.*;


/**
 * 实体类校验器
 * @author src
 * @Date 2020/6/8 10:55
 * @version 1.0
 */
public class BeanValidatorFactory {
    /**
     * 校验bean中添加自定义校验注解的属性
     * @author src
     * @Date 2020/6/8 10:57
     * @version 1.0
     */
    public static ValidateResult validate(Object bean) throws Exception{
        ValidatorUtil.refreshResult();
        // 反射获取运行时类信息
        Class<?> clazz = bean.getClass();
        // 获取所有属性
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            /** 策略工厂 **/
            BeanValidateFactory.getValidator(ValidatorUtil.getAnnotation(field)).beanValidate(field,bean);
        }
        return ValidatorUtil.getValidateResult();
    }

    /**
     *@Description 校验器-过滤不需要校验的属性
     *@Author src
     *@Date 2020-06-13 11:20
     *@Param
     *@return
     */
    public static ValidateResult validate(Set<String> excludes, Object bean) throws Exception{
        ValidatorUtil.refreshResult();
        // 反射获取运行时类信息
        Class<?> clazz = bean.getClass();
        // 获取所有属性
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            /** 策略工厂 **/
            BeanValidateFactory.getValidator(ValidatorUtil.getAnnotation(field)).beanValidate(field,bean,excludes);
        }
        return ValidatorUtil.getValidateResult();
    }

    /**
     *@Description 校验器-校验bean中没有添加自定义注解的属性
     * 1、如果当前添加的字段已经有自定义注解，将使用新的校验格式
     *@Author src
     *@Date 2020-06-13 13:35
     *@Param
     *@return
     */
    public static ValidateResult validate(Object bean, Set<PatternField> patternFields) throws Exception{
        ValidatorUtil.refreshResult();
        // 反射获取运行时类信息
        Class<?> clazz = bean.getClass();
        // 获取所有属性
        Field[] fields = clazz.getDeclaredFields();
        // 新的校验集合
        Set<PatternField> np = new HashSet<>();
        // 添加的属性不存在，不参与校验
        Iterator iterator = patternFields.iterator();
        while (iterator.hasNext()){
            PatternField patternField = (PatternField)iterator.next();
            for (Field field : fields) {
                if(!StringUtils.equals(field.getName(),patternField.getFieldName())){ continue; }
                // 存在属性
                np.add(patternField);
                break;
            }
        }

        for (Field field : fields) {
            /** 策略工厂 **/
            AnnotationFactoty annotationFactoty = BeanValidateFactory.getValidator(ValidatorUtil.getAnnotation(field));
            if(np.size()<=0){
                annotationFactoty.beanValidate(field,bean);
                continue;
            }
            annotationFactoty.beanValidate(bean,field,np);
        }
        return ValidatorUtil.getValidateResult();
    }

}
